package logica.pisos;

import logica.coleccionables.Coleccionable;
import logica.obstaculos.Obstaculo;
import logica.premios.Premio;

/**
 * Clase Piso: modela el piso del nivel. 
 * @author Amorosi, Javier (94528)
 * @author Antiman, Nehuen (102440)
 */
public abstract class Piso {
	
	protected int fila;
	
	protected int columna;
	
	/**
	 * Constructor de la clase Piso. 
	 * @param f representa el índice de fila.
	 * @param c	representa el índice de columna.
	 */
	public Piso (int f, int c){
		fila = f;
		columna = c;
	}
	
	/**
	 * Coloca un premio sobre el piso.
	 * @param p premio a colocar. 
	 */
	public abstract void colocarPremio(Premio p);
	
	/**
	 * Coloca un coleccionable sobre el piso.
	 * @param c coleccionable a colocar. 
	 * @return true si el premio pudo ser colocado exitosamente, esto es así cuando no habia otra cosa
	 * previamente en el piso, false caso contrario.
	 */
	public abstract boolean colocarColeccionable(Coleccionable c);
	
	/**
	 * Coloca un obstáculo sobre el piso.
	 * @param o obstáculo a colocar. 
	*/
	public abstract void colocarObstaculo(Obstaculo o);
	
	/**
	 * Esta operación determina el efecto de un disparo al piso o al objeto que este posicionado sobre él.
	 */
	public abstract void dispararPiso();
	
	/**
	 * Retorna un valor booleando indicando si es posible transitar por este piso.
	 * @return true si es posible transitar sobre este piso, false caso contrario. 
	 */
	public abstract boolean puedoPasar();
	
	/**
	 * Retorna la fila en la que se ubica el piso en el nivel. 
	 * @return fila en la que se ubica el piso en el nivel. 
	 */
	public int getFila(){
		return fila;
	}
	
	/**
	 * Retorna la columna en la que se ubica el piso en el nivel. 
	 * @return columna en la que se ubica el piso en el nivel. 
	 */
	public int getColumna(){
		return columna;
	}
	
	/**
	 * Indica si se ha colocado algún objeto sobre este piso. 
	 * @return true si se ha colocado algo sobre este piso, false caso contrario. 
	 */
	public abstract boolean tieneAlgo();
	
	/**
	 * Indica si se ha colocado un objeto coleccionable sobre este piso. 
	 * @return true si se ha colocado un objeto coleccionable sobre este piso, false caso contrario. 
	 */
	public abstract boolean tieneColeccionable();
	
	/**
	 * Indica si se ha colocado un obstáculo sobre este piso. 
	 * @return true si se ha colocado un obstáculo sobre este piso, false caso contrario. 
	 */
	public abstract boolean tieneObstaculo();
	
	/**
	 * Indica si se ha colocado un premio sobre este piso. 
	 * @return true si se ha colocado un premio sobre este piso, false caso contrario. 
	 */
	public abstract boolean tienePremio();

	/**
	 * En caso de tener un premio lo retorna, y pasa a no tener ninguno.
	 * Si no tiene ningún premio, retorna null.
	 * @return un premio en caso de tenerlo, null caso contrario. 
	 */
	public abstract Premio proveerPremio();
	
	/**
	 * En caso de tener un coleccionable lo retorna, y pasa a no tener ninguno.
	 * Si no tiene ningún coleccionable, retorna null.
	 * @return un coleccionable en caso de tenerlo, null caso contrario. 
	 */
	public abstract Coleccionable proveerColeccionable();
	
	/**
	 * Retonrna el consumo de combustible asociado a este piso.
	 * @return consumo de combustible asociado a este piso.
	 */
	public abstract int consumoCombustible();

}
